/*
 * Università degli Studi di Trento
 * Facoltà di Scienze MM.FF.NN.
 * Corso di Laurea Triennale in Informatica
 * A.A. 2011/2012
 * Progetto per il corso di Sistemi Operativi 1
 * Progetto 3: 
 * Autori:
 * Bertoldi Lorenzo 155863
 * Cattin Cosso Manuel 146607
 * Parrello Nicola 145610
 */

/********************************************************************************
  Questa classe contiene la definizione della struttura del thread padre
  e i metodi ad esso collegati.
********************************************************************************/


#ifndef THREADPADRE_H
#define THREADPADRE_H

#include "threadFiglio.h"
#include "listaThread.h"

#include <stdio.h>


typedef struct SThreadPadre{
    pListaThread listaFigli;
    FILE* file;
  }ThreadPadre;

typedef struct SThreadPadre * pThreadPadre;


/*
 * costruttore :
 * Alloca lo spazio per la struttura
 * Se non esiste crea la directory per i file di log
 * Ricrea il file di log con nome cmd.log
 * Ridirige l'output del programma
 * Restituisce il puntatore
*/
pThreadPadre ThreadPadre_create ();

/*
 * ascoltaEScrivi :
 * Ascolta la pipe in modo da sentire cosa gli comunicano i figli
 * e scrive cio che ha letto
*/
void ThreadPadre_ascoltaEScrivi (pThreadPadre);

/*
 * avviaFiglioCasualmente :
 * Preleva un byte da /dev/random e usa questo byte per scegliere il processo da avviare
*/
int ThreadPadre_avviaFiglioCasualmente (pThreadPadre);

/*
 * newfiglio :
 * Genera un nuovo figlio assegnato al comando
*/
void ThreadPadre_newFiglio(pThreadPadre, char *);

/*
 * creaFileDiLog
 * Creo il file di log del figlio
 */
void creaFileDiLog(pThreadFiglio);


/*
 * startFiglio :
 * Avvia un figlio numero figlio
 * Ritorna : 0 figlio avviato, altrimenti -1
*/
int ThreadPadre_startFiglio(pThreadPadre, int);

/*
 * distruttore:
 * Termina il thread e i suoi figli
 * return: un intero, se 0  distruzione avvenuta
                      se -1 distruzione non avvenuta 
*/
int ThreadPadre_destroy(pThreadPadre);


#endif /* THREADPADRE_H */
